#include <linux/init.h>          
#include <linux/module.h>         
#include <linux/mm.h>          
#include <linux/sched.h>         
#include <linux/sched/task.h>     
#include <linux/mm_types.h>       

// 模块初始化函数
static int __init print_vma_info_init(void) {
    struct task_struct *task = current;  // 获取当前任务的结构体
    struct mm_struct *mm = task->mm;     // 获取任务的内存管理结构
    struct vm_area_struct *vma;          // 用于遍历虚拟内存区域

    if (!mm) {                           // 当前任务是否有内存管理结构
        printk(KERN_INFO "No memory management structure for the current process.\n");
        return 0;    
    }

    // 打印当前任务的名字和 PID
    printk(KERN_INFO "Virtual memory areas for process: %s [PID: %d]\n",
           task->comm, task->pid);

    // 遍历任务的 vm_area_struct 链表
    for (vma = mm->mmap; vma; vma = vma->vm_next) { // 从 mm->mmap 开始，遍历每个 VMA
        unsigned long start = vma->vm_start;       // 获取 VMA 的起始地址
        unsigned long end = vma->vm_end;           // 获取 VMA 的结束地址
        // 打印
        printk(KERN_INFO "VMA Start: 0x%lx, End: 0x%lx, Length: %lu bytes\n",
               start, end, end - start);
    }
    return 0; 
}

static void __exit print_vma_info_exit(void) {
    printk(KERN_INFO "Exiting VMA Info Module.\n"); 
}
module_init(print_vma_info_init); 
module_exit(print_vma_info_exit); 

MODULE_LICENSE("GPL");            // 设置模块许可证为 GPL